<?php
/**
 * Summary
 * 
 * Adaptador para cache basado en archivos. Puede ser usando en conjunto a un 
 * disco ram, de esta forma guardara los registros en memoria.
 * 
 * Todo: Falta crear el colector de basura para hacer expirar los registros
 */

namespace SubMemory\Cache;

/**
 * Adaptador para cache basado en archivos.
 */
class FileCache implements CacheInterface
{
    /**
     * Directorio en el sistema de archivos.
     * @var string 
     */
    protected $_cacheFile = 'cache';
    protected $_index     = array();
    /**
     * Constructor
     * @param string $cacheDir Directorio en el sistema de archivos.
     */
    public function __construct($cacheFile = '')
    {	
        if ($cacheFile !== '') {
            if (!is_file($cacheFile)) {
                throw new \Exception('The specified cache file is invalid.'); 
            }
            $this->_cacheFile = $cacheFile;
			$this->_index     = parse_ini_file($cacheFile);
        }
    }
    
	public function __destruct(){
		#$this->close();
	}
	
    /**
     * Establece un par clave-valor y adicionalmente su tiempo de expiración.
     * @param string $key Clave
     * @param string $data Valor
     * @param int $expirationtime Tiempo de expiración
     */
    public function set($key, $data, $expirationtime=0)
    {
        #$cacheFile = $this->getCacheFile($key);
        $this->_index[$key] = $data;
		$this->save();
        return $this;
    }
    
   /**
     * Obtener valor de una clave.
     * @param string $key
     */
    public function get($key)
    {
        if ($this->exists($key)) {
            
            return $this->_index[$key];
        }
        return null;
    }
    
    /**
     * Borrar una clave
     * @param string $key
     */
    public function delete($key)
    {
        if ($this->exists($key)) {
            unset($this->_index[$key]);
            return true;
        }
        return false;
    }
    
    /**
     * Verifica si el archivo de cache especifico existe.
     * @param $key
     */
    public function exists($key)
    {
        return isset($this->_index[$key]);
    }
    
    /**
     * Obtiene un especifico archivo de cache
     * @param string $key Clave en el cache
     */
    protected function getCacheFile()
    {
        return $this->_cacheFile;
    } 
    
	protected function save(){
		$lines = array();
        foreach ($this->_index as $key => $value) {
            $lines[] = "$key = $value";
        }
		return file_put_contents($this->getCacheFile(),implode("\n", $lines) );
	}
	
	
     /**
     * Cerrar la conexión al cache
     */
    public function close(){
        
		return $this->save();
    }
    
	
	
    /**
     * Colector de basura.
     * @param string $maxlifetime
     */
    public function gc($maxlifetime){
        return true;
    }
}


